/**
 * 作用域安全的构造函数
 * 通过new关键字将this绑定到新实例上
 */

const Foo = function (id) {
  if (this instanceof Foo) {
    this.id = id;
  } else {
    return new Foo(id);
  }
}

const x1 = new Foo(1);
const x2 = Foo(1);
console.log('x1.id: ', x1.id);
console.log('x2.id: ', x2.id);

console.log('***************************');

// 问题在这里，绑定this还可以用call，但这时候就有问题了，结果依然是函数直接执行，返回undefined
const x3 = Foo.call(x1, 2);

console.log('x3：', x3); // undefined
console.log('x1.id: ', x1.id);

console.log('***************************');

// 因此要使用es6 new.target

const Foo1 = function (id) {
  if (new.target === Foo1) {
    this.id = id;
  } else {
    return new Foo1(id);
  }
}

const x4 = new Foo1(4);
const x5 = Foo1(5);
console.log('x4.id: ', x4.id);
console.log('x5.id: ', x5.id);

const x6 = Foo1.call(x4, 6);

console.log('x6.id: ', x6.id);
console.log('x4.id', x4.id);